﻿using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Net;
using System.Web.Services.Protocols;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using DBConnect;

namespace TISS_Add_in
{
    public partial class uc_AcompanhaGuia : UserControl
    {
        #region Propriedades

        private string selectedFile;
        private Int64 IDLote;

        #endregion

        #region Construtor

        public uc_AcompanhaGuia()
        {
            InitializeComponent();
        }

        #endregion

        #region Eventos

        private void uc_AcompanhaGuia_Load(object sender, EventArgs e)
        {
            this.carregaOperadora_e_TipoGuias();
        }

        private void tvLotes_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            tvAcompanhaGuia.SelectedNode = e.Node;

        }

        private void tvAcompanhaGuia_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            switch (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_node)
            {
                case node_type.operadora:
                    tvAcompanhaGuia.SelectedNode.Expand();
                    break;
                case node_type.tipo_lote:
                    tvAcompanhaGuia.SelectedNode.Expand();
                    break;
                case node_type.tipo_solicitacao:
                    tvAcompanhaGuia.SelectedNode.Expand();
                    break;
                case node_type.lote:
                    tvAcompanhaGuia.SelectedNode.Expand();
                    break;
                case node_type.guiaFaturamento:
                    AddinUtils.AbrirGuia(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path);
                    break;
                case node_type.guiaSolicitacao:
                    AddinUtils.AbrirGuia(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path);
                    break;
                case node_type.guiaExtensao:
                    AddinUtils.AbrirGuia(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path);
                    break;
                default:

                    break;
            }
        }

        private void tvLotes_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            tvAcompanhaGuia.SelectedNode = e.Node;

            switch (((TreeNodeContents)e.Node.Tag).tipo_node)
            {
                case node_type.tipo_lote:
                    e.Node.Nodes.Clear();
                    DataTable dtLotes = CommandLotes.buscaLoteGuiasTipo(Globals.ThisAddIn.UsuarioID,
                        ((TreeNodeContents)e.Node.Tag).regANS, (DBConnect.TipoGuia)((TreeNodeContents)e.Node.Tag).tipo_guia);
                    foreach (DataRow drLote in dtLotes.Rows)
                    {
                        carregaLotes(drLote, e.Node);
                    }
                    break;
                case node_type.tipo_solicitacao:
                    e.Node.Nodes.Clear();
                    DataTable dtSolicitacao = CommandSolicitacao.buscaSolicProcTipo(Globals.ThisAddIn.UsuarioID,
                        ((TreeNodeContents)e.Node.Tag).regANS, (DBConnect.TipoGuia)((TreeNodeContents)e.Node.Tag).tipo_guia);
                    foreach (DataRow drGuiaSolicProc in dtSolicitacao.Rows)
                    {
                        carregaGuiasSolicProc(drGuiaSolicProc, e.Node);
                    }
                    break;
                case node_type.lote:
                    e.Node.Nodes.Clear();
                    DataTable dtLote = CommandGuias.buscaGuiasLote((long)((TreeNodeContents)e.Node.Tag).lote_cod);
                    foreach (DataRow drGuia in dtLote.Rows)
                    {
                        carregaGuiasFaturamento(drGuia, e.Node);
                    }
                    break;
            }
        }

        private void tvAcompanhaGuia_AfterCollapse(object sender, TreeViewEventArgs e)
        {
            node_type tipoNode = ((TreeNodeContents)e.Node.Tag).tipo_node;
            if ((tipoNode == node_type.tipo_lote) || (tipoNode == node_type.tipo_solicitacao) ||
                (tipoNode == node_type.lote))
            {
                e.Node.Nodes.Clear();
                e.Node.Nodes.Add("nodeFake");
            }
        }

        private void contextMenuStrip_MouseLeave(object sender, EventArgs e)
        {
            //((System.Windows.Forms.ContextMenuStrip)sender).Close();
        }

        private void contextMenuStrip_Opened(object sender, EventArgs e)
        {
            ((System.Windows.Forms.ContextMenuStrip)sender).Focus();
            ((System.Windows.Forms.ContextMenuStrip)sender).Items[0].Select();
        }

        private void CriarGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            selectedFile = "";
            sfdGuia.FileName = "guia" + ((((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia)).ToString() + DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss");
            if (sfdGuia.ShowDialog() == DialogResult.OK)
            {
                IDLote = Convert.ToInt64(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod);
                selectedFile = sfdGuia.FileName;
                string templatePath = "";
                if (tvAcompanhaGuia.SelectedNode.Nodes.Count < 100)
                {
                    switch (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia)
                    {
                        case TipoGuia.Consulta:
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaConsulta.docx";
                                break;
                        case TipoGuia.SP_SADT:
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSP_SADT.docx";
                                break;
                        case TipoGuia.Resumo_Internação:
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaResumoInternacao.docx";                              
                            break;
                        case TipoGuia.Honorário_Individual:
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaHonorarioIndividual.docx";
                                break;
                        case TipoGuia.Odontologia:
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaOdontologia.docx";                                
                            break;
                        case TipoGuia.Consulta_Reapresentação:
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaConsultaReapresentacao.docx";
                                break;
                        case TipoGuia.SP_SADT_Reapresentação:
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSP_SADTReapresentacao.docx";
                                break;
                        case TipoGuia.Resumo_Internação_Reapresentação:
                                 templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaResumoInternacaoReapresentacao.docx";
                              break;
                        case TipoGuia.Honorário_Individual_Reapresentação:                                                        
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaHonorarioIndividualReapresentacao.docx";
                                break;
                        case TipoGuia.Odontologia_Reapresentação:
                                    templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaOdontologiaReapresentacao.docx";                              
                            break;
                        case TipoGuia.Solicitação_Internação:
                            templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSolicitacaoInternacao.docx";
                            break;
                        case TipoGuia.Solicitação_Prorrogação:
                            templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSolicitacaoProrrogacao.docx";
                            break;
                        case TipoGuia.Solicitação_SADT:
                            templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSolicitacaoSP_SADT.docx";
                            break;
                        case TipoGuia.Solicitação_Odontologia:
                            templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSolicitacaoOdonto.docx";
                            break;
                    }
                }
                else
                    MessageBox.Show("Este lote está cheio");
                if (templatePath != "")
                {
                    File.Copy(templatePath, selectedFile, true);

                    DadosGuia dadosGuia = new DadosGuia(CommandModConf.buscaDadosPrestadorOperadora(Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS).Tables[0].Rows[0]);
                    DadosAutoPreencherGuia dadosAuto = new DadosAutoPreencherGuia(dadosGuia, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia);
                    try
                    {
                        if (sender.ToString() == "Executante")
                            AddinUtils.PreencheGuia(selectedFile, dadosAuto, TipoProfissional.ProfissionalExecutante);    
                        else if (sender.ToString() == "Solicitante")
                            AddinUtils.PreencheGuia(selectedFile, dadosAuto, TipoProfissional.ProfissionalSolicitante);
                        else if (sender.ToString() == "Solicitante e Executante")
                            AddinUtils.PreencheGuia(selectedFile, dadosAuto, TipoProfissional.ProfissionalSolicitanteExecutante);
                    }
                    catch (Exception) { }

                    AddinUtils.AbrirGuia(selectedFile); 

                    AddinUtils.AlteraLogoGuia(dadosGuia.Logo);  

                    uc_NumeroGuia ucNumeroGuia = new uc_NumeroGuia();
                    ucNumeroGuia.NodeContents = (TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag;
                    Globals.ThisAddIn.NumeroGuiaCTP = Globals.ThisAddIn.CustomTaskPanes.Add(ucNumeroGuia, "Número da Guia");
                    Globals.ThisAddIn.NumeroGuiaCTP.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating;
                    Globals.ThisAddIn.NumeroGuiaCTP.Height = 118;
                    Globals.ThisAddIn.NumeroGuiaCTP.Width = 180;
                    Globals.ThisAddIn.NumeroGuiaCTP.Visible = true;
                    Globals.ThisAddIn.NumeroGuiaCTP.Control.Focus();
                    ucNumeroGuia.numeroGuiaChanged += new uc_NumeroGuia.numeroGuiaChangedHandler(this.ucNumeroGuia_numeroGuiaChanged);
                    Globals.ThisAddIn.NumeroGuiaCTP.VisibleChanged += new EventHandler(NumeroGuiaCTP_VisibleChanged);
                }
            }
        }

        private void NumeroGuiaCTP_VisibleChanged(object sender, EventArgs e)
        {
            if (!Globals.ThisAddIn.NumeroGuiaCTP.Visible)
            {
                try
                {
                    object doNotSaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
                    object mis = Globals.ThisAddIn._missing;
                    Globals.ThisAddIn.Application.ActiveDocument.Close(ref doNotSaveChanges, ref mis, ref mis);
                }
                catch (Exception)
                {

                    throw;
                }
            }
        }

        public void ucNumeroGuia_numeroGuiaChanged(object sender)
        {
            uc_NumeroGuia ucNumeroGuia = (uc_NumeroGuia)sender;

            if (ucNumeroGuia.NodeContents.numeroGuia != "")
            {
                object numeroGuiaCC = Globals.ThisAddIn.IndexNumeroGuiaCC;
                if (ucNumeroGuia.NodeContents.tipo_node == node_type.lote)
                    CommandGuias.gravaGuia(selectedFile, IDLote, ucNumeroGuia.NodeContents.numeroGuia);
                else
                    CommandSolicitacao.gravaGuiaSolicitacao(ucNumeroGuia.NodeContents.regANS, Globals.ThisAddIn.UsuarioID, selectedFile, (DBConnect.TipoGuia)ucNumeroGuia.NodeContents.tipo_guia, ucNumeroGuia.NodeContents.numeroGuia);
                Globals.ThisAddIn.doc.ContentControls.get_Item(ref numeroGuiaCC).Range.Text = ucNumeroGuia.NodeContents.numeroGuia;
            }
            carregaTreeViewAcompanhaGuia(ucNumeroGuia.NodeContents);
        }

        private void abrirGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AddinUtils.AbrirGuia(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path);
        }
        
        private void cancelarGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs.URLCancelaGuia.Equals(""))
            {
                if (AddinUtils.ConfiguraConexao(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs))
                {
                    docTissCancela.ws_cancelaGuia enviaCancelaGuia =
                        CancelaGuia.geraCancelaGuia(Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS,
                        ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_data_emissao,
                        ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuiaOperadora);

                    //Enviando a mensagem e recebendo um protocolo de status
                    if (enviaCancelaGuia != null)
                    {
                        try
                        {
                            if (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_node == node_type.guiaFaturamento)
                                CancelaGuia.recebeCancelaGuia(Globals.ThisAddIn.docTISSwsCancelaGuias.tissCancelaGuia_Operation(enviaCancelaGuia), (long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod);
                            else
                                CancelaGuia.recebeCancelaGuia(Globals.ThisAddIn.docTISSwsCancelaGuias.tissCancelaGuia_Operation(enviaCancelaGuia), ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS);
                            carregaTreeViewAcompanhaGuia((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag);
                        }
                        catch (SoapException spEx)
                        {
                            //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                            Mensagem.mensagemTISS_remove(Convert.ToInt64(enviaCancelaGuia.cabecalho.identificacaoTransacao.sequencialTransacao));
                            AddinUtils.ShowErrorMessageWS(spEx);
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("A operadora não possui URL de WebService cadastrado para esta operação!", "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void reapresentarGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_node == node_type.guiaFaturamento)
            {
                uc_LotesReapresentacao ucLotesReapresentacao = new uc_LotesReapresentacao();
                ucLotesReapresentacao.NodeContents = (TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag;
                Globals.ThisAddIn.LotesReapresentacaoCTP = Globals.ThisAddIn.CustomTaskPanes.Add(ucLotesReapresentacao, "Lotes de " + ((TipoGuia)(ucLotesReapresentacao.NodeContents.tipo_guia + 5)).ToString() + " Não Enviados");
                Globals.ThisAddIn.LotesReapresentacaoCTP.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating;
                Globals.ThisAddIn.LotesReapresentacaoCTP.Height = 340;
                Globals.ThisAddIn.LotesReapresentacaoCTP.Width = 193;
                Globals.ThisAddIn.LotesReapresentacaoCTP.Visible = true;
                Globals.ThisAddIn.LotesReapresentacaoCTP.Control.Focus();
            }
            else
            {
                selectedFile = "";
                sfdGuia.FileName = "guia" + ((TipoGuia)(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia)).ToString() + DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss");
                if (sfdGuia.ShowDialog() == DialogResult.OK)
                {
                    selectedFile = sfdGuia.FileName;
                    //ReapresentacaoGuia.reapresentaGuia(templatePath, xmlNode, xmlNode, selectedFile, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path);
                    File.Copy(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path, selectedFile);
                    AddinUtils.AbrirGuia(selectedFile);

                    uc_NumeroGuia ucNumeroGuia = new uc_NumeroGuia();
                    ucNumeroGuia.NodeContents = (TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag;
                    Globals.ThisAddIn.NumeroGuiaCTP = Globals.ThisAddIn.CustomTaskPanes.Add(ucNumeroGuia, "Número da Guia");
                    Globals.ThisAddIn.NumeroGuiaCTP.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating;
                    Globals.ThisAddIn.NumeroGuiaCTP.Height = 118;
                    Globals.ThisAddIn.NumeroGuiaCTP.Width = 180;
                    Globals.ThisAddIn.NumeroGuiaCTP.Visible = true;
                    Globals.ThisAddIn.NumeroGuiaCTP.Control.Focus();

                    ucNumeroGuia.numeroGuiaChanged += new uc_NumeroGuia.numeroGuiaChangedHandler(this.ucNumeroGuia_numeroGuiaChanged);
                }
            }
        }

        private void statusProcedimentosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia == TipoGuia.Consulta ||
                ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia == TipoGuia.Consulta_Reapresentação)
                MessageBox.Show("Esta guia não possui Procedimentos!");
            else
            {
                GuiaSolicitacaoProcedimento classGuiaSolicitacao = new GuiaSolicitacaoProcedimento(Globals.ThisAddIn.UsuarioID,
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia,
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia);

                classGuiaSolicitacao.insereGuiaPath(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path, false);

                if (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_node == node_type.guiaFaturamento)
                {
                    //Verifica se ja existe Status dos Procedimentos da Guia de Faturamento
                    if (!CommandSolicitacao.existeStatusProcFaturamento(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia,
                        (long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod))
                    {
                        //Gera uma mensagemTiss de Solicitação de Protocolo para pegar os novos Status dos Procedimentos
                        this.solicitaStatusProtocolo(false);
                    }

                    //if ((((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia == TipoGuia.SP_SADT) || (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia == TipoGuia.SP_SADT_Reapresentação)
                    //    || (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia == TipoGuia.Resumo_Internação) || (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia == TipoGuia.Resumo_Internação_Reapresentação))
                    {
                        foreach (TreeNode guiaExtNode in tvAcompanhaGuia.SelectedNode.Nodes)
                        {
                            classGuiaSolicitacao.insereGuiaPath(((TreeNodeContents)guiaExtNode.Tag).guia_path, true);
                        }
                    }

                    ProcedimentoHandler.showStatusProcedimentos((long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod, classGuiaSolicitacao, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_node);
                }
                else
                {
                    foreach (TreeNode guiaExtNode in tvAcompanhaGuia.SelectedNode.Nodes)
                    {
                        classGuiaSolicitacao.insereGuiaPath(((TreeNodeContents)guiaExtNode.Tag).guia_path, true);
                    }
                    ProcedimentoHandler.showStatusProcedimentos(classGuiaSolicitacao, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_node);
                }
            }
        }

        private void removerGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string numeroGuia = ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia;
            string tipoNode = Convert.ToString(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_node);
            try
            {
                File.Delete(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path);
                if (tipoNode == "guiaFaturamento")
                    CommandGuias.removeGuia((long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod, numeroGuia);
                else
                    if (tipoNode == "guiaSolicitacao")
                        CommandSolicitacao.removeGuiaSolicitacao(Globals.ThisAddIn.UsuarioID, numeroGuia);
                    else
                        if (tipoNode == "guiaExtensao")
                        {
                            switch (Convert.ToString(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia))
                            {
                                case "SP_SADT": CommandGuias.removeOutrasDespesas((long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guiaID);
                                    break;
                                case "Resumo_Internação": CommandGuias.removeOutrasDespesas((long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guiaID);
                                    break;
                                default:
                                    CommandSolicitacao.removeExtensaoSolicProc((long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guiaID);
                                    break;
                            }                            
                        }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Esta guia não pode ser removida!\n\n" + ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
            TipoGuia tipoGuia = ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia;
            if (tipoGuia == TipoGuia.SP_SADT || tipoGuia == TipoGuia.Resumo_Internação ||
                tipoGuia == TipoGuia.Resumo_Internação_Reapresentação || tipoGuia == TipoGuia.SP_SADT_Reapresentação)
            {
                foreach (TreeNode guiaOD_node in tvAcompanhaGuia.SelectedNode.Nodes)
                    try
                    {
                        File.Delete(((TreeNodeContents)guiaOD_node.Tag).guia_path);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Esta guia não pode ser removida!\n\n" + ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
            }
            carregaTreeViewAcompanhaGuia((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag);
        }
        /// <summary>
        /// Gera XML do Lote selecionado e salva em um arquivo.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gerarXMLLoteGuias_Click(object sender, EventArgs e)
        {
            if (fbdXml.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    tvAcompanhaGuia.SelectedNode.Expand();
                    List<string[]> guiasPath = new List<string[]>();
                    foreach (TreeNode node in tvAcompanhaGuia.SelectedNode.Nodes)
                    {
                        string[] guiaPath = new string[(1 + node.Nodes.Count)];
                        guiaPath[0] = ((TreeNodeContents)node.Tag).guia_path;

                        if (node.Nodes.Count > 0)
                        {
                            int countOutrasDespesas = 1;
                            foreach (TreeNode nodeOutrasDespesas in node.Nodes)
                            {
                                guiaPath[countOutrasDespesas] = ((TreeNodeContents)nodeOutrasDespesas.Tag).guia_path;
                                countOutrasDespesas++;
                            }
                        }
                        guiasPath.Add(guiaPath);
                        AddinUtils.FecharGuia(guiaPath[0]);
                    }

                    docTissLoteGuias.ws_loteGuias objetoXML =
                        LoteGuias.GeraLoteGuias(Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, 
                        tvAcompanhaGuia.SelectedNode.Text, guiasPath, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia, tipoTransacao.GERA_XML_ENVIO_LOTE_GUIAS);

                    if (objetoXML != null)
                    {
                        if (objetoXML.loteGuias.guias.Item != null)
                        {
                            try
                            {
                                mensagemTISS msgTissLoteGuias = new mensagemTISS();

                                //Cabecalho
                                msgTissLoteGuias.cabecalho = (cabecalhoTransacao)XMLUtils.Deserializa(XMLUtils.Serializa(objetoXML.cabecalho, null), typeof(cabecalhoTransacao), null);

                                ////Corpo
                                mensagemTISSPrestadorParaOperadora tipoMsg = new mensagemTISSPrestadorParaOperadora();
                                tipoMsg.Item = (ct_loteGuias)XMLUtils.Deserializa(XMLUtils.Serializa(objetoXML.loteGuias, null), typeof(ct_loteGuias), null);
                                msgTissLoteGuias.Item = tipoMsg;

                                //Fechando a MensagemTISS de Solicitação de Procedimento e serializando em memória
                                Stream streamMensagem = new MemoryStream();
                                streamMensagem = XMLUtils.Serializa(msgTissLoteGuias, null);

                                //Fim da Mensagem: HASH
                                //Lendo a mensagem previamene carregada em memória
                                XmlDocument docMensagem = new XmlDocument();
                                docMensagem.Load(streamMensagem);
                                string textoHash = "";
                                textoHash = docMensagem.DocumentElement.InnerText;

                                msgTissLoteGuias.epilogo = new mensagemTISSEpilogo();
                                msgTissLoteGuias.epilogo.hash = AddinUtils.CalculateMD5Hash(textoHash);

                                ////<sequencial de mensagem TISS>_<hash MD5 da mensagem>.xml
                                XmlTextWriter writer = new XmlTextWriter(fbdXml.SelectedPath + "\\" + msgTissLoteGuias.cabecalho.identificacaoTransacao.sequencialTransacao.PadLeft(12, '0') +
                                    "_" + msgTissLoteGuias.epilogo.hash + ".xml", System.Text.Encoding.GetEncoding("ISO-8859-1"));
                                writer.WriteStartDocument();
                                writer.WriteComment("XML Gerado pelo docTISS versão 1.0.2 - Data: " + DateTime.Now.ToString("dd/MM/yyyy HH:mm"));

                                XmlSerializer xsMensagem = new XmlSerializer(typeof(mensagemTISS), XMLUtils.ElementRootWithANSnamespace("mensagemTISS"));
                                xsMensagem.Serialize(writer, msgTissLoteGuias, XMLUtils.ANSnamespace());
                                writer.Close();

                                MessageBox.Show("Mensagem XML gerada com sucesso!", "Sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                            }
                            catch (Exception ex)
                            {
                                throw ex;
                            }

                        }
                    }
                    else
                    {
                        MessageBox.Show("Prestador não cadastrado na operadora!", "Erro no XML!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
                catch (Exception err)
                {
                    MessageBox.Show("Erro ao gerar XML do Lote de Guias!\n" + err.Message, "Erro no XML!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
        }

        private void gerarXMLSolicitacaoProcedimento_Click(object sender, EventArgs e)
        {
            if (fbdXml.ShowDialog() == DialogResult.OK)
            {
                GuiaSolicitacaoProcedimento classGuiaSolicitacaoProcedimento = new GuiaSolicitacaoProcedimento(Globals.ThisAddIn.UsuarioID,
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia,
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia);

                classGuiaSolicitacaoProcedimento.insereGuiaPath(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path, false);

                foreach (TreeNode guiaExtNode in tvAcompanhaGuia.SelectedNode.Nodes)
                {
                    classGuiaSolicitacaoProcedimento.insereGuiaPath(((TreeNodeContents)guiaExtNode.Tag).guia_path, true);
                }

                docTissSolicitacaoProcedimento.ws_solicitacaoProcedimento solicitacaoProcedimento =
                    SolicitacaoProcedimentos.geraSolicitacaoProcedimento(ref classGuiaSolicitacaoProcedimento, true);

                if (solicitacaoProcedimento.cabecalho != null)
                {
                    try
                    {
                        mensagemTISS msgSolicitacaoProcedimento = new mensagemTISS();
                        //Cabecalho
                        msgSolicitacaoProcedimento.cabecalho = (cabecalhoTransacao)XMLUtils.Deserializa(XMLUtils.Serializa(solicitacaoProcedimento.cabecalho, null), typeof(cabecalhoTransacao), null);

                        //Corpo
                        mensagemTISSPrestadorParaOperadoraSolicitacaoProcedimento msgSolicProc = new mensagemTISSPrestadorParaOperadoraSolicitacaoProcedimento();
                        switch (classGuiaSolicitacaoProcedimento.TipoSolicitacao)
                        {
                            case TipoGuia.Solicitação_Internação:
                                ct_guiaSolicInternacao guiaSolicInternacao = (ct_guiaSolicInternacao)XMLUtils.Deserializa(XMLUtils.Serializa(solicitacaoProcedimento.solicitacaoProcedimento.Items[0], XMLUtils.ElementRootWithANSnamespace("guiaSolicInternacao")), typeof(ct_guiaSolicInternacao), XMLUtils.ElementRootWithANSnamespace("guiaSolicInternacao"));
                                msgSolicProc.Item = guiaSolicInternacao;
                                break;
                            case TipoGuia.Solicitação_Prorrogação:
                                break;
                            case TipoGuia.Solicitação_SADT:
                                break;
                            case TipoGuia.Solicitação_Odontologia:
                                break;
                        }

                        mensagemTISSPrestadorParaOperadora tipoMsg = new mensagemTISSPrestadorParaOperadora();
                        tipoMsg.Item = msgSolicProc;
                        msgSolicitacaoProcedimento.Item = tipoMsg;

                        //Fechando a MensagemTISS de Solicitação de Procedimento e serializando em memória
                        Stream streamMensagem = new MemoryStream();
                        streamMensagem = XMLUtils.Serializa(msgSolicitacaoProcedimento, XMLUtils.ElementRootWithANSnamespace("mensagemTISS"));

                        //Fim da Mensagem: HASH
                        //Lendo a mensagem previamene carregada em memória
                        XmlDocument docMensagem = new XmlDocument();
                        docMensagem.Load(streamMensagem);
                        string TextoHash = "";
                        TextoHash = docMensagem.DocumentElement.InnerText;

                        msgSolicitacaoProcedimento.epilogo = new mensagemTISSEpilogo();
                        msgSolicitacaoProcedimento.epilogo.hash = AddinUtils.CalculateMD5Hash(TextoHash);

                        ////<sequencial de mensagem TISS>_<hash MD5 da mensagem>.xml
                        XmlTextWriter writer = new XmlTextWriter(fbdXml.SelectedPath + "\\" + msgSolicitacaoProcedimento.cabecalho.identificacaoTransacao.sequencialTransacao +
                            "_" + msgSolicitacaoProcedimento.epilogo.hash + ".xml", System.Text.Encoding.GetEncoding("ISO-8859-1"));
                        writer.WriteStartDocument();
                        writer.WriteComment("XML Gerado pelo docTISS versão 1.0.2 - Data: " + DateTime.Now.ToString("dd/MM/yyyy HH:mm"));

                        XmlSerializer xsMensagem = new XmlSerializer(typeof(mensagemTISS), XMLUtils.ElementRootWithANSnamespace("mensagemTISS"));
                        xsMensagem.Serialize(writer, msgSolicitacaoProcedimento, XMLUtils.ANSnamespace());
                        writer.Close();

                        MessageBox.Show("Mensagem XML gerada com sucesso!", "Sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                    catch (Exception exx)
                    {
                        MessageBox.Show("Erro ao gerar XML de Solicitação de Procedimento!\n" + exx.Message, "Erro no XML!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
            }
        }

        private void importarGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string nomeUltimaGuia = null;

            try
            {
                OpenFileDialog ofdGuia = new OpenFileDialog();
                ofdGuia.Multiselect = true;
                ofdGuia.Title = "Importar Guias";
                ofdGuia.Filter = "Guia docTISS (*.docx)|*.docx|" +
                                 "Todos os arquivos (*.*)|";
                ofdGuia.DefaultExt = "docx";

                if (ofdGuia.ShowDialog() == DialogResult.OK)
                {
                    List<string> importadas = new List<string>();
                    List<string> invalidas = new List<string>();
                    List<string> naoImportadas = new List<string>();

                    foreach (string guiaPath in ofdGuia.FileNames)
                    {
                        if (Path.GetExtension(guiaPath).Equals(".docx"))
                        {
                            nomeUltimaGuia = Path.GetFileNameWithoutExtension(guiaPath);
                            TipoGuiaCustomXML guiaCustonXML = new TipoGuiaCustomXML();
                            try
                            {
                                //TODO: Revisar função para gerar guia (passar o tipo da guia)
                                guiaCustonXML = LoteGuias.ExtraiGuiaCustomXML(guiaPath);
                            }
                            catch (Exception)
                            {
                                invalidas.Add(guiaPath);
                            }

                            if (guiaCustonXML.customXML != null)
                            {
                                string numeroGuia = null;
                                if (guiaCustonXML.tipoGuia == ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia)
                                {
                                    switch (guiaCustonXML.tipoGuia)
                                    {
                                        case TipoGuia.Consulta:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaConsulta)guiaCustonXML.customXML).identificacaoGuia.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.SP_SADT:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaSP_SADT)guiaCustonXML.customXML).identificacaoGuiaSADTSP.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Resumo_Internação:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaResumoInternacao)guiaCustonXML.customXML).identificacaoGuiaInternacao.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Honorário_Individual:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaHonorarioIndividual)guiaCustonXML.customXML).identificacaoGuiaHonorarioIndividual.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Odontologia:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaOdontologia)guiaCustonXML.customXML).cabecalhoGuia.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Consulta_Reapresentação:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaConsultaReapresentacao)guiaCustonXML.customXML).identificacaoGuia.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.SP_SADT_Reapresentação:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaSP_SADTReapresentacao)guiaCustonXML.customXML).identificacaoGuiaSADTSP.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Resumo_Internação_Reapresentação:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaResumoInternacaoReapresentacao)guiaCustonXML.customXML).identificacaoGuiaInternacao.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Honorário_Individual_Reapresentação:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaHonorarioIndividualReapresentacao)guiaCustonXML.customXML).identificacaoGuiaHonorarioIndividual.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Odontologia_Reapresentação:
                                            numeroGuia = ((TISS_Add_in.docTissLoteGuias.ct_guiaOdontologia)guiaCustonXML.customXML).cabecalhoGuia.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Solicitação_Internação:
                                            numeroGuia = ((TISS_Add_in.docTissSolicitacaoProcedimento.ct_guiaSolicInternacao)guiaCustonXML.customXML).identificacaoGuiaSolicitacaoInternacao.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Solicitação_Prorrogação:
                                            numeroGuia = ((TISS_Add_in.docTissSolicitacaoProcedimento.ct_guiaSolicitacaoProrrogacao)guiaCustonXML.customXML).identificacaoProrrogacao.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Solicitação_SADT:
                                            numeroGuia = ((TISS_Add_in.docTissSolicitacaoProcedimento.ct_guiaSolicitacaoSP_SADT)guiaCustonXML.customXML).identificacaoGuiaSolicitacaoSADTSP.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Solicitação_Odontologia:
                                            numeroGuia = ((TISS_Add_in.docTissSolicitacaoProcedimento.ct_guiaSolicitacaoOdonto)guiaCustonXML.customXML).cabecalhoGuia.numeroGuiaPrestador;
                                            break;
                                        case TipoGuia.Demonstrativo_Pagamento:
                                            break;
                                        case TipoGuia.Demonstrativo_Análise_Conta:
                                            break;
                                        case TipoGuia.Demonstrativo_Odontologia:
                                            break;
                                        default:
                                            break;
                                    }

                                    if (numeroGuia != null)
                                    {
                                        int guiaExiste = CommandGuias.verificaNumeroGuia(Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, numeroGuia);

                                        if (guiaExiste == 0)
                                        {
                                            try
                                            {
                                                CommandGuias.gravaGuia(guiaPath, Convert.ToInt64(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod), numeroGuia);
                                                importadas.Add(guiaPath);
                                            }
                                            catch (Exception)
                                            {
                                                naoImportadas.Add(guiaPath);
                                            }
                                        }
                                        else
                                            naoImportadas.Add(guiaPath);
                                    }
                                }
                                else
                                    naoImportadas.Add(guiaPath);
                            }
                            else
                                naoImportadas.Add(guiaPath);
                        }
                        else
                            invalidas.Add(guiaPath);
                    }

                    string relatorio = "";
                    if (importadas.Count > 0)
                    {
                        carregaTreeViewAcompanhaGuia((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag);

                        relatorio += "Guias importadas:\n";
                        foreach (string path in importadas)
                        {
                            relatorio += path + "\n";
                        }
                        relatorio += "\n";
                    }
                    if (naoImportadas.Count > 0)
                    {
                        relatorio += "Guias não importadas:\n";
                        foreach (string path in naoImportadas)
                        {
                            relatorio += path + "\n";
                        }
                        relatorio += "\n";
                    }
                    if (invalidas.Count > 0)
                    {
                        relatorio += "Arquivos em formato inválido:\n";
                        foreach (string path in invalidas)
                        {
                            relatorio += path + "\n";
                        }
                        relatorio += "\n";
                    }
                    MessageBox.Show(relatorio, "Importar Guia", MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("XML") && nomeUltimaGuia != null)
                {
                    MessageBox.Show("A guia não pôde ser importada:\n\nA guia '" + nomeUltimaGuia + "' contem problemas de validação em sua estrutura.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
        }

        #region Faturamento

        private void solicitaStatusProtocolo(bool exibeStatusLote)
        {
            if (!((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs.URLSolicitacaoStatusProtocolo.Equals(""))
            {
                if (AddinUtils.ConfiguraConexao(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs))
                {
                    docTissStatusProtocolo.ws_solicitacaoStatusProtocolo solicitacao =
                        StatusProtocolo.geraSolicStatusProtocolo((long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod, Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS);

                    if (solicitacao != null)
                    {
                        try
                        {
                            StatusProtocolo.recebeStatusProtocolo(Globals.ThisAddIn.docTISSwsStatusProtocolo.tissSolicitacaoStatusProtocolo_Operation(solicitacao), exibeStatusLote);
                        }
                        catch (SoapException spEx)
                        {
                            //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                            Mensagem.mensagemTISS_remove(Convert.ToInt64(solicitacao.cabecalho.identificacaoTransacao.sequencialTransacao));
                            AddinUtils.ShowErrorMessageWS(spEx);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Prestador não cadastrado na operadora!");
                    }
                }
            }
            else
            {
                MessageBox.Show("A operadora não possui URL de WebService cadastrado para esta operação!", "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void solicitarStatusProtocoloToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.solicitaStatusProtocolo(true);
        }

        private void visualizarStatusDoLoteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DataRow drLote = CommandLotes.buscaLoteGuiasProtocolo(Globals.ThisAddIn.UsuarioID,
                ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS,
                ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).protocolo.ToString());
            MessageBox.Show("Número do protocolo: " + drLote["protocoloRecebimento"].ToString() +
                "\nSituação do lote: " + ((statusRecebimento)drLote["codStatusRecebimento"]).ToString() +
                "\nData de envio do lote: " + drLote["dataTransacao"].ToString(),
                "Status do Protocolo", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
        }

        private void adicionarOutrasDespesasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            selectedFile = "";
            sfdGuia.FileName = "guiaOutrasDespesas" + tvAcompanhaGuia.SelectedNode.Parent.Parent.Text + DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss");
            if (sfdGuia.ShowDialog() == DialogResult.OK)
            {
                selectedFile = sfdGuia.FileName;
                string templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaOutrasDespesas.docx";
                File.Copy(templatePath, selectedFile, true);

                DadosGuia dadosGuia = new DadosGuia(CommandModConf.buscaDadosPrestadorOperadora(Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS).Tables[0].Rows[0]);
                //AddinUtils.PreencheGuia(selectedFile, dadosGuia, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Parent.Tag).tipo_guia);

                AddinUtils.AbrirGuia(selectedFile);

                AddinUtils.AlteraLogoGuia(dadosGuia.Logo);  

                DBConnect.CommandGuias.insereOutrasDespesas(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia, selectedFile, (long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod);
                carregaTreeViewAcompanhaGuia((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag);
            }
        }

        private void enviarLoteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs.URLLoteGuias.Equals(""))
            {
                if (AddinUtils.ConfiguraConexao(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs))
                {
                    string nomeGuia = "";
                    try
                    {
                        List<string[]> guiasPath = new List<string[]>();
                        tvAcompanhaGuia.SelectedNode.Expand();
                        foreach (TreeNode node in tvAcompanhaGuia.SelectedNode.Nodes)
                        {
                            string[] guiaPath = new string[(1 + node.Nodes.Count)];
                            guiaPath[0] = ((TreeNodeContents)node.Tag).guia_path;

                            if (node.Nodes.Count > 0)
                            {
                                int countOutrasDespesas = 1;
                                foreach (TreeNode nodeOutrasDespesas in node.Nodes)
                                {
                                    guiaPath[countOutrasDespesas] = ((TreeNodeContents)nodeOutrasDespesas.Tag).guia_path;
                                    countOutrasDespesas++;
                                }
                            }
                            guiasPath.Add(guiaPath);
                            //TODO: Testar o fechar Guia
                            AddinUtils.FecharGuia(guiaPath);
                        }

                        docTissLoteGuias.ws_loteGuias envia =
                            LoteGuias.GeraLoteGuias(Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, 
                            tvAcompanhaGuia.SelectedNode.Text, guiasPath, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia, tipoTransacao.ENVIO_LOTE_GUIAS);
                        docTissLoteGuias.ws_protocoloRecebimento recebe = new TISS_Add_in.docTissLoteGuias.ws_protocoloRecebimento();

                        if (envia != null)
                        {
                            if (envia.loteGuias.guias.Item != null)
                            {
                                try
                                {
                                    //Enviando a mensagem e recebendo um protocolo de status
                                    recebe = Globals.ThisAddIn.docTISSwsLoteGuias.tissLoteGuias_Operation(envia);

                                    if (recebe.protocoloRecebimento.ItemElementName == TISS_Add_in.docTissLoteGuias.ItemChoiceType5.numeroProtocoloRecebimento)
                                    {
                                        //Armazenando o loteGuias enviado junto com o protocoloRecebimento no Banco de Dados
                                        CommandLotes.updateSequencialTransacaoLoteGuias((long)((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).lote_cod, Convert.ToInt64(envia.cabecalho.identificacaoTransacao.sequencialTransacao), recebe.protocoloRecebimento.Item, 1);
                                        MessageBox.Show("O Andamento da Guia pode ser acompanhado a qualquer momento.", "Mensagem enviada com sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                                        carregaTreeViewAcompanhaGuia((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag);
                                    }
                                    else
                                    {
                                        //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                                        Mensagem.mensagemTISS_remove(Convert.ToInt64(envia.cabecalho.identificacaoTransacao.sequencialTransacao));
                                        MessageBox.Show(recebe.protocoloRecebimento.Item, "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                    }
                                }
                                catch (SoapException spEx)
                                {
                                    //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                                    Mensagem.mensagemTISS_remove(Convert.ToInt64(envia.cabecalho.identificacaoTransacao.sequencialTransacao));
                                    MessageBox.Show("O Web Service da operadora retornou um erro:\n\n" + spEx.Message, "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                }
                                catch (WebException wbEx)
                                {
                                    //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                                    Mensagem.mensagemTISS_remove(Convert.ToInt64(envia.cabecalho.identificacaoTransacao.sequencialTransacao));
                                    MessageBox.Show("Houve um erro na conexão.\n Por favor verifique as configurações do Web Service.\n\n" + wbEx.Message, "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                }
                                catch (Exception ex)
                                {
                                    //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                                    Mensagem.mensagemTISS_remove(Convert.ToInt64(envia.cabecalho.identificacaoTransacao.sequencialTransacao));
                                    MessageBox.Show("Houve um erro na conexão.\n Por favor verifique as configurações do Web Service.\n\n" + ex.Message, "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                }
                            }
                        }
                        else
                        {
                            MessageBox.Show("Prestador não cadastrado na operadora!", "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        }
                    }
                    catch (Exception ex)
                    {
                        if (ex.Message.Contains("XML"))
                        {
                            MessageBox.Show("O lote não pode ser enviado:\n\nA guia '" + nomeGuia + "' contem problemas de validação em sua estrutura.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        }
                        else
                        {
                            MessageBox.Show(ex.Message, "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("A operadora não possui URL de WebService cadastrado para esta operação!", "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void criarLoteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DBConnect.TipoGuia tipoGuia = (DBConnect.TipoGuia)(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia);
            string[] dadosLote = CommandLotes.criaLoteGuia(tipoGuia, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, Globals.ThisAddIn.UsuarioID);
            if (dadosLote[0] == "0")
                MessageBox.Show(" O intervalo de lotes cadastrados para esta Operadora está esgotado!\nPor favor, cadastre um novo intervalo no menu Configuração.");
            else
            {
                if (dadosLote[0] == "-1")
                    MessageBox.Show("Não existe intervalo de lotes cadastrado para esta operadora!");
                else
                {
                    TreeNode node_loteGuia = new TreeNode(dadosLote[0]);
                    //Pega o ID do lote_Guia
                    TreeNodeContents tn_loteGuia = new TreeNodeContents(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia, Convert.ToInt64(dadosLote[1]), ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs);
                    node_loteGuia.Tag = tn_loteGuia;

                    node_loteGuia.ContextMenuStrip = GeraContextMenuStrip(node_type.lote, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia, false, null);

                    node_loteGuia.ImageIndex = 2;
                    node_loteGuia.SelectedImageIndex = 2;
                    tvAcompanhaGuia.SelectedNode.Nodes.Add(node_loteGuia);

                    tvAcompanhaGuia.SelectedNode.Expand();
                }
            }
        }

        #endregion

        #region Solicitação

        private void enviarProcedimentoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (AddinUtils.ConfiguraConexao(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs))
            {
                //objetos de envio e recebimento
                GuiaSolicitacaoProcedimento classGuiaSolicitacaoProcedimento = new GuiaSolicitacaoProcedimento(Globals.ThisAddIn.UsuarioID,
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia,
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia);

                classGuiaSolicitacaoProcedimento.insereGuiaPath(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path, false);

                foreach (TreeNode guiaExtNode in tvAcompanhaGuia.SelectedNode.Nodes)
                {
                    classGuiaSolicitacaoProcedimento.insereGuiaPath(((TreeNodeContents)guiaExtNode.Tag).guia_path, true);
                }

                docTissSolicitacaoProcedimento.ws_solicitacaoProcedimento enviaSolicProc =
                    SolicitacaoProcedimentos.geraSolicitacaoProcedimento(ref classGuiaSolicitacaoProcedimento, false);
                if (enviaSolicProc.cabecalho != null)
                {
                    try
                    {
                        SolicitacaoProcedimentos.recebeSolicitacaoProcedimento(Globals.ThisAddIn.docTISSwsSolicitacaoProcedimento.tissSolicitacaoProcedimento_Operation(enviaSolicProc), classGuiaSolicitacaoProcedimento);
                        CommandSolicitacao.updateSequencialTransacaoSolicProc(classGuiaSolicitacaoProcedimento.RegANS, classGuiaSolicitacaoProcedimento.CodPrestador, classGuiaSolicitacaoProcedimento.NumeroGuia, Convert.ToInt64(enviaSolicProc.cabecalho.identificacaoTransacao.sequencialTransacao));
                        carregaTreeViewAcompanhaGuia((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag);
                    }
                    catch (SoapException spEx)
                    {
                        //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                        Mensagem.mensagemTISS_remove(Convert.ToInt64(enviaSolicProc.cabecalho.identificacaoTransacao.sequencialTransacao));
                        AddinUtils.ShowErrorMessageWS(spEx);
                    }
                }
                else
                {
                    MessageBox.Show("Prestador não cadastrado na operadora!", "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
        }

        private void solicitarStatusAutorizacao_Click(object sender, EventArgs e)
        {
            if (AddinUtils.ConfiguraConexao(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs))
            {
                //objetos de envio e recebimento
                GuiaSolicitacaoProcedimento classGuiaSolicitacaoProcedimento = new GuiaSolicitacaoProcedimento(Globals.ThisAddIn.UsuarioID,
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia,
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia);

                classGuiaSolicitacaoProcedimento.insereGuiaPath(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path, false);

                foreach (TreeNode guiaExtNode in tvAcompanhaGuia.SelectedNode.Nodes)
                {
                    classGuiaSolicitacaoProcedimento.insereGuiaPath(((TreeNodeContents)guiaExtNode.Tag).guia_path, true);
                }

                docTissStatusAutorizacao.ws_solicitacaoStatusAutorizacao solicitacaoAutorizacao =
                    StatusAutorizacao.geraSolicitacaoStatusAutorizacao(classGuiaSolicitacaoProcedimento);

                GuiaSolicitacaoProcedimento[] classGuiasSolicitacao = new GuiaSolicitacaoProcedimento[1];
                classGuiasSolicitacao[0] = classGuiaSolicitacaoProcedimento;

                if (solicitacaoAutorizacao != null)
                {
                    try
                    {
                        StatusAutorizacao.recebeStatusAutorizacao(Globals.ThisAddIn.docTISSwsStatusAutorizacao.tissSolicitacaoStatusAutorizacao_Operation(solicitacaoAutorizacao), classGuiasSolicitacao);
                    }
                    catch (SoapException spEx)
                    {
                        //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                        Mensagem.mensagemTISS_remove(Convert.ToInt64(solicitacaoAutorizacao.cabecalho.identificacaoTransacao.sequencialTransacao));
                        AddinUtils.ShowErrorMessageWS(spEx);
                    }
                }
                else
                {
                    MessageBox.Show("Prestador não cadastrado na operadora!");
                }
            }
        }

        private void extenderGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            sfdGuia.FileName = Path.GetFileNameWithoutExtension(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path) + "Extensao";
            if (sfdGuia.ShowDialog() == DialogResult.OK)
            {
                selectedFile = sfdGuia.FileName;
                string templatePath = "", guia = "";
                Stream strGuia = new MemoryStream();
                switch (((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).tipo_guia)
                {
                    case TipoGuia.Solicitação_Internação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSolicitacaoInternacao.docx";
                        guia = "guiaSolicitacaoInternacao";   
                    /* strGuia = XMLUtils.GetCustomXmlPart(((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).guia_path, "guiaSolicInternacao");
                        ct_guiaSolicInternacao guiaSolicInternacao = new ct_guiaSolicInternacao();
                        XmlSerializer xs = new XmlSerializer(typeof(ct_guiaSolicInternacao), XMLUtils.ElementRootWithANSnamespace("guiaSolicInternacao"));
                        guiaSolicInternacao = (ct_guiaSolicInternacao)xs.Deserialize(strGuia);
                        guiaSolicInternacao.procedimentosExamesSolicitados = null;
                        guiaSolicInternacao.OPMsSolicitadas = null;
                        strGuia = new MemoryStream();
                        xs.Serialize(strGuia, guiaSolicInternacao, XMLUtils.ANSnamespace());*/
                        break;
                    case TipoGuia.Solicitação_Prorrogação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSolicitacaoProrrogacao.docx";
                        guia = "guiaSolicitacaoProrrogacao";
                        break;
                    case TipoGuia.Solicitação_SADT:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSolicitacaoSP_SADT.docx";
                        guia = "guiaSolicitacaoSP_SADT";
                        break;
                    case TipoGuia.Solicitação_Odontologia:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "templates\\guiaSolicitacaoOdontologia.docx";
                        guia = "guiaSolicitacaoOdontologia"; 
                        break;
                }
                if (templatePath != "")
                {
                    strGuia.Position = 0;
                    XmlDocument xdocGuia = new XmlDocument();
                    //xdocGuia.Load(strGuia);
                    File.Copy(templatePath, selectedFile, true);
                    XMLUtils.SubstituiCustomXmlPart(selectedFile, guia, xdocGuia);

                    CommandSolicitacao.gravaGuiaSolicitacaoExt(Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).regANS,
                        selectedFile, ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).numeroGuia);
                    AddinUtils.AbrirGuia(selectedFile);
                }
            }
            carregaTreeViewAcompanhaGuia((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag);
        }

        #endregion

        #endregion

        #region Métodos

        private void carregaOperadora_e_TipoGuias()
        {
            tvAcompanhaGuia.Nodes.Clear();
            //Retorna TODOS os lotes enviados que estão armazenados no BD local
            //Retorna TODAS as operadoras Filiadas ao Prestador
            DataTable dtOperadoraFiliada = DBConnect.CommandModConf.buscaOperadoraFiliadaURL(Globals.ThisAddIn.UsuarioID);

            //Existe alguma operadora?
            if (dtOperadoraFiliada.Rows.Count > 0)
            {
                foreach (DataRow drOperadora in dtOperadoraFiliada.Rows)
                {
                    //Cria Node da Operadora
                    TreeNode node_operadora = nodeOperadora(drOperadora);

                    TipoGuia[] tiposGuia = {TipoGuia.Consulta, TipoGuia.SP_SADT, TipoGuia.Resumo_Internação, TipoGuia.Honorário_Individual, 
                                               TipoGuia.Odontologia, TipoGuia.Consulta_Reapresentação, TipoGuia.SP_SADT_Reapresentação, 
                                               TipoGuia.Resumo_Internação_Reapresentação, TipoGuia.Honorário_Individual_Reapresentação, 
                                               TipoGuia.Solicitação_Internação, TipoGuia.Solicitação_SADT, TipoGuia.Solicitação_Prorrogação, 
                                               TipoGuia.Solicitação_Odontologia};
                    foreach (TipoGuia tipoGuia in tiposGuia)
                    {
                        //Cria Node do Tipo Lote
                        node_operadora.Nodes.Add(nodeTipoLote(tipoGuia, node_operadora));
                    }
                    tvAcompanhaGuia.Nodes.Add(node_operadora);
                }
            }
        }

        private URLWebServices URLsOperadora(DataRow drOperadora)
        {
            URLWebServices URLs = new URLWebServices();
            URLs.URLCancelaGuia = drOperadora["url_cancela"].ToString();
            URLs.URLLoteGuias = drOperadora["url_lote"].ToString();
            URLs.URLSolicitacaoDemonstrativoRetorno = drOperadora["url_demonstrativo"].ToString();
            URLs.URLSolicitacaoProcedimento = drOperadora["url_procedimento"].ToString();
            URLs.URLSolicitacaoStatusProtocolo = drOperadora["url_protocolo"].ToString();
            URLs.URLSolicitacaoStatusAutorizacao = drOperadora["url_autorizacao"].ToString();
            return URLs;
        }

        private TreeNode nodeOperadora(DataRow drOperadora)
        {
            //Adiciona Operadora a um Node
            TreeNode node_operadora = new TreeNode(drOperadora["nome"].ToString());
            node_operadora.Tag = new TreeNodeContents(drOperadora["regANS"].ToString(), URLsOperadora(drOperadora));
            node_operadora.ImageIndex = 0;
            node_operadora.SelectedImageIndex = 0;
            return node_operadora;
        }

        private TreeNode nodeTipoLote(TipoGuia tipoLote, TreeNode node_operadora)
        {
            //Adiciona Tipo de loteGuia
            TreeNode node_tipoLote = new TreeNode(tipoLote.ToString());
            node_tipoLote.Tag = new TreeNodeContents(((TreeNodeContents)node_operadora.Tag).regANS, tipoLote, ((TreeNodeContents)node_operadora.Tag).URLs);
            if (tipoLote <= TipoGuia.Odontologia_Reapresentação)
            {
                node_tipoLote.ContextMenuStrip = GeraContextMenuStrip(node_type.tipo_lote, ((TreeNodeContents)node_tipoLote.Tag).tipo_guia, null, null);
                node_tipoLote.ImageIndex = 1;
                node_tipoLote.SelectedImageIndex = 1;
            }
            else
            {
                if (tipoLote == TipoGuia.Solicitação_Internação)
                {
                    node_tipoLote.ImageIndex = 7;
                    node_tipoLote.SelectedImageIndex = 7;
                }
                if (tipoLote == TipoGuia.Solicitação_Prorrogação)
                {
                    node_tipoLote.ImageIndex = 8;
                    node_tipoLote.SelectedImageIndex = 8;
                }
                if (tipoLote == TipoGuia.Solicitação_SADT)
                {
                    node_tipoLote.ImageIndex = 9;
                    node_tipoLote.SelectedImageIndex = 9;
                }
                if (tipoLote == TipoGuia.Solicitação_Odontologia)
                {
                    node_tipoLote.ImageIndex = 10;
                    node_tipoLote.SelectedImageIndex = 10;
                }
                node_tipoLote.ContextMenuStrip = GeraContextMenuStrip(node_type.tipo_solicitacao, ((TreeNodeContents)node_tipoLote.Tag).tipo_guia, null, null);
            }
            node_tipoLote.Nodes.Add("nodeFake");
            return node_tipoLote;
        }

        private void carregaLotes(DataRow drLoteGuias, TreeNode node_tipoLote)
        {
            //Adiciona loteGuia em um TreeNode
            TreeNode node_loteGuia = new TreeNode(drLoteGuias["numeroLote"].ToString());
            TreeNodeContents tn_loteGuia;
            //Se Lote ja foi Enviado
            if (drLoteGuias["sequencialTransacao"].ToString() != "")
            {
                tn_loteGuia = new TreeNodeContents(((TreeNodeContents)node_tipoLote.Tag).regANS,
                    ((TreeNodeContents)node_tipoLote.Tag).tipo_guia, Convert.ToInt64(drLoteGuias["ID"].ToString()),
                    Convert.ToInt64(drLoteGuias["sequencialTransacao"].ToString()), drLoteGuias["protocoloRecebimento"].ToString(),
                    ((TreeNodeContents)tvAcompanhaGuia.SelectedNode.Tag).URLs);
                node_loteGuia.ContextMenuStrip = GeraContextMenuStrip(node_type.lote, ((TreeNodeContents)node_tipoLote.Tag).tipo_guia, true, null);
                node_loteGuia.ImageIndex = 3;
                node_loteGuia.SelectedImageIndex = 3;
            }
            //Se o Lote não foi Enviado
            else
            {
                tn_loteGuia = new TreeNodeContents(((TreeNodeContents)node_tipoLote.Tag).regANS,
                    ((TreeNodeContents)node_tipoLote.Tag).tipo_guia, Convert.ToInt64(drLoteGuias.ItemArray[2].ToString()),
                    ((TreeNodeContents)node_tipoLote.Tag).URLs);

                node_loteGuia.ContextMenuStrip = GeraContextMenuStrip(node_type.lote, ((TreeNodeContents)node_tipoLote.Tag).tipo_guia, false, null);

                node_loteGuia.ImageIndex = 2;
                node_loteGuia.SelectedImageIndex = 2;
            }
            node_loteGuia.Tag = tn_loteGuia;
            node_loteGuia.Nodes.Add("nodeFake");
            node_tipoLote.Nodes.Add(node_loteGuia);
        }

        private void carregaGuiasFaturamento(DataRow drGuias, TreeNode nodePai)
        {
            TipoGuia tipoGuia = ((TreeNodeContents)nodePai.Tag).tipo_guia;
            //Adiciona Guia em um TreeNode
            TreeNode node_Guia = new TreeNode(Path.GetFileNameWithoutExtension(drGuias["local"].ToString()));
            TreeNodeContents tn_guia;

            //Se Lote Não Enviado
            if (((TreeNodeContents)nodePai.Tag).sequencial_transacao == null)
            {
                tn_guia = new TreeNodeContents(((TreeNodeContents)nodePai.Tag).regANS,
                    ((TreeNodeContents)nodePai.Tag).tipo_guia, ((TreeNodeContents)nodePai.Tag).lote_cod,
                    drGuias["numeroGuia"].ToString(), drGuias["local"].ToString(), drGuias["dataEmissao"].ToString(),
                    ((TreeNodeContents)nodePai.Tag).URLs);
                node_Guia.ImageIndex = 4;
                node_Guia.SelectedImageIndex = 4;

                node_Guia.ContextMenuStrip = GeraContextMenuStrip(node_type.guiaFaturamento, ((TreeNodeContents)nodePai.Tag).tipo_guia, false, null);
            }
            else //Lote Enviado
            {
                tn_guia = new TreeNodeContents(((TreeNodeContents)nodePai.Tag).regANS,
                    ((TreeNodeContents)nodePai.Tag).tipo_guia, ((TreeNodeContents)nodePai.Tag).lote_cod,
                    ((TreeNodeContents)nodePai.Tag).sequencial_transacao, ((TreeNodeContents)nodePai.Tag).protocolo,
                    drGuias["numeroGuia"].ToString(), drGuias["numeroGuiaOperadora"].ToString(),
                    drGuias["local"].ToString(), drGuias["dataEmissao"].ToString(), ((TreeNodeContents)nodePai.Tag).URLs);
                //Se guia foi cancelada
                if (Convert.ToBoolean(drGuias.ItemArray[2].ToString()))
                {
                    node_Guia.ImageIndex = 5;
                    node_Guia.SelectedImageIndex = 5;
                    node_Guia.ContextMenuStrip = GeraContextMenuStrip(node_type.guiaFaturamento, ((TreeNodeContents)nodePai.Tag).tipo_guia, null, null);
                }
                else
                {
                    //Se guia com Glosa e foi Reenviada
                    if ((Convert.ToBoolean(drGuias["glosa"].ToString())) && (Convert.ToBoolean(drGuias["reapresentada"].ToString())))
                    {
                        node_Guia.ImageIndex = 6;
                        node_Guia.SelectedImageIndex = 6;
                        node_Guia.ContextMenuStrip = GeraContextMenuStrip(node_type.guiaFaturamento, ((TreeNodeContents)nodePai.Tag).tipo_guia, true, false);
                    }
                    else
                        //Se guia com Glosa e não foi Reenviada
                        if ((Convert.ToBoolean(drGuias["glosa"].ToString())) && (!(Convert.ToBoolean(drGuias["reapresentada"].ToString()))))
                        {
                            node_Guia.ImageIndex = 6;
                            node_Guia.SelectedImageIndex = 6;
                            node_Guia.ContextMenuStrip = node_Guia.ContextMenuStrip = GeraContextMenuStrip(node_type.guiaFaturamento, ((TreeNodeContents)nodePai.Tag).tipo_guia, true, true);
                        }
                        else //Se guia Enviada e Normal
                        {
                            node_Guia.ImageIndex = 4;
                            node_Guia.SelectedImageIndex = 4;
                            node_Guia.ContextMenuStrip = node_Guia.ContextMenuStrip = GeraContextMenuStrip(node_type.guiaFaturamento, ((TreeNodeContents)nodePai.Tag).tipo_guia, true, false);
                        }
                }
            }
            node_Guia.Tag = tn_guia;

            //Verifica se a Guia tem guias de Outras Despesas
            if ((tipoGuia == TipoGuia.SP_SADT) || (tipoGuia == TipoGuia.Resumo_Internação) ||
                (tipoGuia == TipoGuia.SP_SADT_Reapresentação) || (tipoGuia == TipoGuia.Resumo_Internação_Reapresentação))
            {
                //Adiciona Outras despesas em um TreeNode                                                    
                DataTable dtOutrasDespesas = DBConnect.CommandGuias.buscaOutrasDespesasGuia(((TreeNodeContents)node_Guia.Tag).numeroGuia, (long)((TreeNodeContents)node_Guia.Tag).lote_cod);
                foreach (DataRow drOutrasDespesas in dtOutrasDespesas.Rows)
                {
                    TreeNode node_OutrasDespesas = new TreeNode(Path.GetFileNameWithoutExtension(drOutrasDespesas["local"].ToString()));
                    node_OutrasDespesas.ImageIndex = 4;
                    node_OutrasDespesas.SelectedImageIndex = 4;
                    TreeNodeContents tagOutrasDepesas;
                    //Se Lote de GuiasPai Enviado
                    if (((TreeNodeContents)nodePai.Tag).sequencial_transacao == 0)
                    {
                        tagOutrasDepesas = new TreeNodeContents(((TreeNodeContents)node_Guia.Tag).regANS,
                            ((TreeNodeContents)node_Guia.Tag).tipo_guia, ((TreeNodeContents)node_Guia.Tag).numeroGuia,
                            drOutrasDespesas["local"].ToString(), ((TreeNodeContents)node_Guia.Tag).guia_data_emissao,
                            Convert.ToInt64(drOutrasDespesas["ID"].ToString()));
                        node_OutrasDespesas.ContextMenuStrip = GeraContextMenuStrip(node_type.guiaFaturamento, ((TreeNodeContents)node_Guia.Tag).tipo_guia, null, null);
                    }
                    //Se Lote de GuiasPai não Enviado
                    else
                    {
                        tagOutrasDepesas = new TreeNodeContents(((TreeNodeContents)node_Guia.Tag).regANS,
                            ((TreeNodeContents)node_Guia.Tag).tipo_guia, ((TreeNodeContents)node_Guia.Tag).sequencial_transacao,
                            ((TreeNodeContents)node_Guia.Tag).protocolo, ((TreeNodeContents)node_Guia.Tag).numeroGuia,
                            ((TreeNodeContents)node_Guia.Tag).numeroGuiaOperadora, drOutrasDespesas["local"].ToString(),
                            ((TreeNodeContents)node_Guia.Tag).guia_data_emissao, Convert.ToInt64(drOutrasDespesas["ID"].ToString()));
                        node_OutrasDespesas.ContextMenuStrip = GeraContextMenuStrip(node_type.guiaFaturamento, ((TreeNodeContents)node_Guia.Tag).tipo_guia, false, null);

                    }
                    node_OutrasDespesas.Tag = tagOutrasDepesas;
                    node_Guia.Nodes.Add(node_OutrasDespesas);
                }
            }
            nodePai.Nodes.Add(node_Guia);
        }

        private void carregaGuiasSolicProc(DataRow drProc, TreeNode nodePai)
        {
            TreeNode node_guiaSolicitacao = new TreeNode(Path.GetFileNameWithoutExtension(drProc["local"].ToString()));
            TreeNodeContents tn_Proc;

            //Se Guia não Enviada
            if (drProc["sequencialTransacao"].ToString() == "")
            {
                tn_Proc = new TreeNodeContents(((TreeNodeContents)nodePai.Tag).regANS,
                    ((TreeNodeContents)nodePai.Tag).tipo_guia, drProc["numeroGuia"].ToString(),
                    drProc["local"].ToString(), drProc["dataEmissao"].ToString(),
                    ((TreeNodeContents)nodePai.Tag).URLs);
                node_guiaSolicitacao.ImageIndex = 4;
                node_guiaSolicitacao.SelectedImageIndex = 4;
                node_guiaSolicitacao.ContextMenuStrip = ctxGuiaProcNaoEnviada;
            }
            //Se Guia Enviada
            else
            {
                tn_Proc = new TreeNodeContents(((TreeNodeContents)nodePai.Tag).regANS,
                    ((TreeNodeContents)nodePai.Tag).tipo_guia, Convert.ToInt64(drProc["sequencialTransacao"].ToString()),
                    drProc["numeroGuia"].ToString(), drProc["numeroGuiaOperadora"].ToString(), drProc["local"].ToString(),
                    drProc["dataEmissao"].ToString(), ((TreeNodeContents)nodePai.Tag).URLs);
                //Se Guia Cancelada
                if (Convert.ToBoolean(drProc["cancelada"].ToString()))
                {
                    node_guiaSolicitacao.ImageIndex = 5;
                    node_guiaSolicitacao.SelectedImageIndex = 5;
                    node_guiaSolicitacao.ContextMenuStrip = ctxGuiaEnviada;
                }
                //se Guia tem Glosa
                else if (Convert.ToBoolean(drProc["glosa"].ToString()))
                {
                    node_guiaSolicitacao.ImageIndex = 6;
                    node_guiaSolicitacao.SelectedImageIndex = 6;
                    node_guiaSolicitacao.ContextMenuStrip = ctxGuiaProcEnviadaGlosa;
                }
                else //Guia Normal Enviada
                {
                    node_guiaSolicitacao.ImageIndex = 11;
                    node_guiaSolicitacao.SelectedImageIndex = 11;
                    node_guiaSolicitacao.ContextMenuStrip = ctxGuiaProcEnviada;
                }
            }

            node_guiaSolicitacao.Tag = tn_Proc;

            //Procura e adiciona Guias de Extensão
            DataTable dtExtSolicProc = CommandSolicitacao.buscaExtensaoSolicProcGuia(Globals.ThisAddIn.UsuarioID, ((TreeNodeContents)nodePai.Tag).regANS, drProc["numeroGuia"].ToString());
            foreach (DataRow drExtSolicProc in dtExtSolicProc.Rows)
            {
                TreeNode node_extProc = new TreeNode(Path.GetFileNameWithoutExtension(drExtSolicProc["local"].ToString()));
                TreeNodeContents tn_guiaExt;
                //Se guia solicitação não Enviada
                if (((TreeNodeContents)node_guiaSolicitacao.Tag).sequencial_transacao == null)
                {
                    tn_guiaExt = new TreeNodeContents(((TreeNodeContents)node_guiaSolicitacao.Tag).regANS,
                        ((TreeNodeContents)node_guiaSolicitacao.Tag).tipo_guia, ((TreeNodeContents)node_guiaSolicitacao.Tag).numeroGuia,
                        drExtSolicProc["local"].ToString(), ((TreeNodeContents)node_guiaSolicitacao.Tag).guia_data_emissao,
                        Convert.ToInt64(drExtSolicProc["ID"].ToString()));
                    node_extProc.ContextMenuStrip = ctxGuiaNaoEnviada;
                }
                else //se guia Solicitação Enviada
                {
                    tn_guiaExt = new TreeNodeContents(((TreeNodeContents)node_guiaSolicitacao.Tag).regANS,
                        ((TreeNodeContents)node_guiaSolicitacao.Tag).tipo_guia,
                        ((TreeNodeContents)node_guiaSolicitacao.Tag).sequencial_transacao, null,
                        ((TreeNodeContents)node_guiaSolicitacao.Tag).numeroGuia,
                        ((TreeNodeContents)node_guiaSolicitacao.Tag).numeroGuiaOperadora,
                        drExtSolicProc["local"].ToString(), ((TreeNodeContents)node_guiaSolicitacao.Tag).guia_data_emissao,
                        Convert.ToInt64(drExtSolicProc["ID"].ToString()));
                    node_extProc.ContextMenuStrip = ctxGuiaEnviada;
                }
                node_extProc.Tag = tn_guiaExt;
                node_extProc.ImageIndex = 4;
                node_extProc.SelectedImageIndex = 4;
                node_guiaSolicitacao.Nodes.Add(node_extProc);
            }
            nodePai.Nodes.Add(node_guiaSolicitacao);
        }

        private void carregaTreeViewAcompanhaGuia(TreeNodeContents node)
        {
            carregaOperadora_e_TipoGuias();
            foreach (TreeNode operadora_node in tvAcompanhaGuia.Nodes)
            {
                if (((TreeNodeContents)operadora_node.Tag).regANS == node.regANS)
                {
                    operadora_node.Expand();
                    foreach (TreeNode tipoGuia_node in operadora_node.Nodes)
                    {
                        if (((TreeNodeContents)tipoGuia_node.Tag).tipo_guia == node.tipo_guia)
                        {
                            tipoGuia_node.Expand();
                            if (node.lote_cod != null)
                            {
                                foreach (TreeNode lote_node in tipoGuia_node.Nodes)
                                {
                                    if (((TreeNodeContents)tipoGuia_node.Tag).lote_cod == node.lote_cod)
                                    {
                                        lote_node.Expand();
                                        break;
                                    }
                                }
                            }
                            break;
                        }
                    }
                    break;
                }
            }
        }

        public ContextMenuStrip GeraContextMenuStrip(node_type tipoNo, TipoGuia tipoGuia, bool? loteEnviado, bool? guiaGlosa)
        {
            ContextMenuStrip ctx = new ContextMenuStrip();
            ToolStripSeparator separadorMenuItem = new ToolStripSeparator();

            switch (tipoNo)
            {
                case node_type.operadora:
                    break;
                case node_type.tipo_lote:
                    ToolStripMenuItem criarLoteMenuItem = new ToolStripMenuItem("Criar Lote", TISS_Add_in.Properties.Resources.criarLote32, criarLoteToolStripMenuItem_Click);

                    ctx.Items.Add(criarLoteMenuItem);
                    break;
                case node_type.tipo_solicitacao:
                    ToolStripMenuItem criarSolicitacaoMenuItem = new ToolStripMenuItem("Criar Solicitacao", TISS_Add_in.Properties.Resources.criarGuia16, CriarGuiaToolStripMenuItem_Click);
                    ToolStripMenuItem importarGuiaSolicitacaoMenuItem = new ToolStripMenuItem("Importar Guia", TISS_Add_in.Properties.Resources.importarGuia16, importarGuiaToolStripMenuItem_Click);

                    ctx.Items.Add(criarSolicitacaoMenuItem);
                    ctx.Items.Add(importarGuiaSolicitacaoMenuItem);
                    break;
                case node_type.lote:
                    if (loteEnviado.HasValue)
                    {
                        if (loteEnviado.Value)
                        {
                            ToolStripMenuItem statusLoteMenuItem = new ToolStripMenuItem("Status do Lote", TISS_Add_in.Properties.Resources.statusProtocolo16, visualizarStatusDoLoteToolStripMenuItem_Click);
                            ToolStripMenuItem statusLoteAtualizaMenuItem = new ToolStripMenuItem("Atualizar Status do Lote", TISS_Add_in.Properties.Resources.statusProcedimento16, solicitarStatusProtocoloToolStripMenuItem_Click);

                            ctx.Items.Add(statusLoteMenuItem);
                            ctx.Items.Add(statusLoteAtualizaMenuItem);
                        }
                        else
                        {
                            ToolStripMenuItem criaGuiaMenuItem;

                            switch (tipoGuia)
                            {
                                case TipoGuia.Consulta:
                                case TipoGuia.Consulta_Reapresentação:
                                case TipoGuia.SP_SADT:
                                case TipoGuia.SP_SADT_Reapresentação:
                                case TipoGuia.Honorário_Individual:
                                case TipoGuia.Honorário_Individual_Reapresentação:
                                    criaGuiaMenuItem = new ToolStripMenuItem("Criar Guia", TISS_Add_in.Properties.Resources.criarGuia16);
                                    criaGuiaMenuItem.DropDownItems.Add("Auto Preencher:");
                                    criaGuiaMenuItem.DropDownItems.Add("Em branco", TISS_Add_in.Properties.Resources.criarGuia16, CriarGuiaToolStripMenuItem_Click);
                                    criaGuiaMenuItem.DropDownItems.Add("Solicitante", TISS_Add_in.Properties.Resources.PrestadorSolicitante16, CriarGuiaToolStripMenuItem_Click);
                                    criaGuiaMenuItem.DropDownItems.Add("Executante", TISS_Add_in.Properties.Resources.PrestadorExecutante16, CriarGuiaToolStripMenuItem_Click);
                                    criaGuiaMenuItem.DropDownItems.Add("Solicitante e Executante", TISS_Add_in.Properties.Resources.PrestadorSolicitanteExecutante16, CriarGuiaToolStripMenuItem_Click);
                                    break;
                                case TipoGuia.Resumo_Internação:
                                case TipoGuia.Resumo_Internação_Reapresentação:
                                case TipoGuia.Odontologia:
                                case TipoGuia.Odontologia_Reapresentação:
                                    criaGuiaMenuItem = new ToolStripMenuItem("Criar Guia", TISS_Add_in.Properties.Resources.criarGuia16);
                                    criaGuiaMenuItem.DropDownItems.Add("Auto Preencher:");
                                    criaGuiaMenuItem.DropDownItems.Add("Em branco", TISS_Add_in.Properties.Resources.criarGuia16, CriarGuiaToolStripMenuItem_Click);
                                    criaGuiaMenuItem.DropDownItems.Add("Executante", TISS_Add_in.Properties.Resources.PrestadorExecutante16, CriarGuiaToolStripMenuItem_Click);
                                    break;
                                default:
                                    criaGuiaMenuItem = new ToolStripMenuItem("Criar Guia", TISS_Add_in.Properties.Resources.criarGuia16, CriarGuiaToolStripMenuItem_Click);
                                    break;
                            }

                            ToolStripMenuItem importarGuiaLoteMenuItem = new ToolStripMenuItem("Importar Guia", TISS_Add_in.Properties.Resources.importarGuia16, importarGuiaToolStripMenuItem_Click);
                            ToolStripMenuItem enviarLoteMenuItem = new ToolStripMenuItem("Enviar Lote", TISS_Add_in.Properties.Resources.enviarLote16, enviarLoteToolStripMenuItem_Click);
                            ToolStripMenuItem gerarXMLMenuItem = new ToolStripMenuItem("Gerar XML", TISS_Add_in.Properties.Resources.gerarXml16, gerarXMLLoteGuias_Click);

                            ctx.Items.Add(criaGuiaMenuItem);
                            ctx.Items.Add(importarGuiaLoteMenuItem);
                            ctx.Items.Add(separadorMenuItem);
                            ctx.Items.Add(enviarLoteMenuItem);
                            ctx.Items.Add(gerarXMLMenuItem);
                        }
                    }
                    break;
                case node_type.guiaFaturamento:
                    ToolStripMenuItem abrirGuiaMenuItem = new ToolStripMenuItem("Abrir Guia", TISS_Add_in.Properties.Resources.abrirGuia16, abrirGuiaToolStripMenuItem_Click);
                    ctx.Items.Add(abrirGuiaMenuItem);

                    if (loteEnviado.HasValue)
                    {
                        if (loteEnviado.Value)
                        {
                            ToolStripMenuItem cancelarGuiaMenuItem = new ToolStripMenuItem("Cancelar Guia", TISS_Add_in.Properties.Resources.guiaCancelada16, cancelarGuiaToolStripMenuItem_Click);
                            ToolStripMenuItem statusProcedimentoMenuItem = new ToolStripMenuItem("Status Procedimentos", TISS_Add_in.Properties.Resources.statusProcedimento16, statusProcedimentosToolStripMenuItem_Click);

                            ctx.Items.Add(cancelarGuiaMenuItem);
                            ctx.Items.Add(separadorMenuItem);
                            ctx.Items.Add(statusProcedimentoMenuItem);

                            if (guiaGlosa.HasValue && guiaGlosa.Value)
                            {
                                ToolStripMenuItem reapresentarGuiaMenuItem = new ToolStripMenuItem("Reapresentar Guia", TISS_Add_in.Properties.Resources.enviarGuia32, reapresentarGuiaToolStripMenuItem_Click);
                                ctx.Items.Add(reapresentarGuiaMenuItem);
                            }
                        }
                        else
                        {
                            ToolStripMenuItem removerGuiaLoteMenuItem = new ToolStripMenuItem("Remover Guia", TISS_Add_in.Properties.Resources.guiaCancelada16, removerGuiaToolStripMenuItem_Click);
                            ctx.Items.Add(removerGuiaLoteMenuItem);

                            if ((tipoGuia == TipoGuia.SP_SADT) || (tipoGuia == TipoGuia.Resumo_Internação) ||
                                (tipoGuia == TipoGuia.SP_SADT_Reapresentação) || (tipoGuia == TipoGuia.Resumo_Internação_Reapresentação))
                            {
                                ToolStripMenuItem adicionarOutrasDespesasLoteMenuItem = new ToolStripMenuItem("Adicionar outras despesas", TISS_Add_in.Properties.Resources.criarGuia16, adicionarOutrasDespesasToolStripMenuItem_Click);

                                ctx.Items.Add(separadorMenuItem);
                                ctx.Items.Add(adicionarOutrasDespesasLoteMenuItem);
                            }
                        }
                    }
                    break;
                case node_type.guiaSolicitacao:
                    break;
                case node_type.guiaExtensao:
                    break;
                default:
                    break;
            }

            return ctx;
        }

        #endregion       
    }
}
